/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package E_implicito_Sequencial;

/**
 *
 * @author rafaelob
 */
public class TabelaHash {

    private int tamanhoTabela;
    private Celula celulas[];

    public TabelaHash(int tamanho) {
        celulas = new Celula[tamanho];
        this.tamanhoTabela = tamanho;
        for (int i = 0; i < tamanho; i++) { //Preenche a tabela com as células de acordo com o tamanho da tabela hash
            celulas[i] = new Celula(i);
        }
    }

    private int getIndex(int chave) { //calcula a função hash associada a essa chave
        return chave % tamanhoTabela;
    }

    public int insertion(int chave) {
        Record record = new Record(chave);
        int index = getIndex(chave);
        if (celulas[index].insertRecord(record)) {
            return 0; // inserido sem colisão
        } else { //Se houve colisão, vamos tratá-la
            index++;
            for (int count = 0; count < (tamanhoTabela - 1); count++) {
                index = index % tamanhoTabela;
                if (celulas[index].insertRecord(record)) {
                    return 1; //inserido com Colisão 
                }
                index++;
            }
            return -1; //tabela cheia


        }

    }

    public Celula getCelula(int posicao) {
        return celulas[posicao];
    }

    public int search(int chave) {
        int index = getIndex(chave);
        int acessos = 1;
        for (int count = 0; ((count < (tamanhoTabela))  && (!celulas[index].searchRecord(chave))); count++) {
            acessos++;
            index++;
            index = index % tamanhoTabela;

        }
        return acessos;

    }
}


